package com.jia.interviewPro;

import java.util.Stack;

/**
 * @program: Leetcode
 * @description: 面试题 03.05. 栈排序
 * 栈排序。 编写程序，对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据，但不得将元素复制到别的数据结构（如数组）中。该栈支持如下操作：push、pop、peek 和 isEmpty。当栈为空时，peek 返回 -1。
 *
 * 示例1:
 *
 *  输入：
 * ["SortedStack", "push", "push", "peek", "pop", "peek"]
 * [[], [1], [2], [], [], []]
 *  输出：
 * [null,null,null,1,null,2]
 * 示例2:
 *
 *  输入：
 * ["SortedStack", "pop", "pop", "push", "pop", "isEmpty"]
 * [[], [], [], [1], [], []]
 *  输出：
 * [null,null,null,null,null,true]
 *
 * @author: STU756
 * @create: 2020-08-05 01:42
 */
public class Pro0305 {

    //原始栈
    Stack<Integer> stack = new Stack<>();
    //辅助栈
    Stack<Integer> tmp = new Stack<>();
    public Pro0305(){

    }

    public void push(int val) {
        //比较原始栈和辅助栈顶值，使其满足辅助栈<= val <= 原始栈
        while(!stack.isEmpty() && stack.peek() < val) {
            tmp.push(stack.pop());
        }
        while(!tmp.isEmpty() && tmp.peek() > val) {
            stack.push(tmp.pop());
        }
        stack.push(val);
    }
    public void pop(){
        //将辅助栈元素push到原始栈中
        while(!tmp.isEmpty()) {
            stack.push(tmp.pop());
        }
        if(!stack.isEmpty()) {
            stack.pop();
        }
    }
    public int peek(){
        //将辅助栈元素push到原始栈中
        while(!tmp.isEmpty()) {
            stack.push(tmp.pop());
        }
        return stack.isEmpty()? -1 : stack.peek();
    }
    public boolean isEmpty() {
        return stack.isEmpty() && tmp.isEmpty();
    }
}
